﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PVFSLEAP
{
	class C_NODE
	{
		F_SETT	ST = new F_SETT();

		// [ General Inoformation ] ---------------------------------------------------------------
		public	int		NDID;			// Node ID
		public	int		POSX;			// Position X
		public	int		POSY;			// Posttion Y
		public	int		PRID;			// Parent ID
		public	int		HPCT;			// Hop Count
		public	double	ENGY;			// Node Energy
		public	float	COST;			// Cost from the base station to a node
		public	int		MGCT;			// Message Count
		public	int		CHLD;			// Child Number of Each Node
		public	bool	VRND;			// Verification Node
        public  int     VRNC;           // Verification Success count    JK

		public	bool	CPNF;
		public	int[]	CPND;
		public	bool	WORM;

		public	int		OFVI;
		public	int		OFRI;			// Occurance of False Report Injection Attack
		public	int		OWRM;			// Occurance of Wormhole Attack

		public	int		DFVI;			// Detection of False Vote Injection Attack
		public	int		DFRI;			// Detection of False Report Injection Attack
		public	int		DWRM;			// Detection of Wormhole Attack

		Random R = new Random( ( int )DateTime.Now.Millisecond );
		Random N = new Random( ( int )DateTime.Now.Millisecond + 1 );
		Random C = new Random( ( int )DateTime.Now.Millisecond % 99 );


        // 노드에 대한 정보 값 초기화 JK
		public C_NODE()
		{
			// [ General Inoformation ]
			NDID = -1;
			POSX = -1;
			POSY = -1;
			PRID = -1;
			HPCT = -1;
			ENGY = 0.0f;
			COST = -0.0f;
			MGCT = 0;
			CHLD = 0;
			VRND = false;
            VRNC = 0; // JK

			CPND = new int[ST.OTVFV];
			CPNF = false;
			WORM = false;

			DFVI = 0;
			DFRI = 0;
			DWRM = 0;

			OFVI = 0;
			OFRI = 0;
			OWRM = 0;

			initializeArray( CPND );
		}

        /***************************************************************************************************
         * 1. 함수: 클러스터 범위 내 헤드 노드들의 초기화
         * 2. 설명: 그리드 내에 있는 헤드들의 길이를 잰 후 개수 count
         * 3. 입력 
         *    1) arr: 필드 내에 있는 그리드 개수
         * ************************************************************************************************/
		public void initializeArray( int[] arr )
		{
			for ( int i = 0; i < arr.Length; i++ )
				arr[i] = 0;
		}


        /***************************************************************************************************
         * 1. 함수: 클러스터 범위 지정 후 x위치 반환
         * 2. 설명: 모든 노드를 랜덤하게 위치를 지정할 경우 노드 분포가 한 곳에 쏠림 현상이 발생하기 때문에 센서 필드를 그리드로 나누어서 시작 위치와 끝 위치를 지정
         * 3. 입력 
         *    1) s: 시작번호
         *    2) e: 끝번호
         * ************************************************************************************************/
		public int randPosX( int s, int e )
		{
			//System.Threading.Thread.Sleep( 1 );
			return R.Next( s, e - 20 );
		}


        /***************************************************************************************************
         * 1. 함수: 클러스터 범위 지정 후 y위치 반환
         * 2. 설명: randPosX의 Y좌표 위치를 지정
         * 3. 입력 
         *    1) s: 시작번호
         *    2) e: 끝번호
         * ************************************************************************************************/
		public int randPosY( int s, int e )
		{
			//System.Threading.Thread.Sleep( 1 );
			return R.Next( s, e - 20 );
		}

        /***************************************************************************************************
         * 1. 함수: 클러스터 범위내에 있는 CH의 위치
         * 2. 설명: CH초의 초기화된 위치 값을 반환한다.
         * 3. 입력 
         *    1) ndid: CH 노드 아이디
         *    2) posx: CH X좌표
         *    3) posy: CH y좌표
         * ************************************************************************************************/
		public void setPosition( int ndid, int posx, int posy )
		{
			NDID = ndid;
			POSX = posx;
			POSY = posy;
		}


        /***************************************************************************************************
         * 1. 함수: 그리드 범위 랜덤 값 입력
         * 2. 설명: 그리드 범위가 0.0001초 기다린 후 N 다음 값 리턴
         * 3. 입력 
         *    1) s: 시작번호
         *    2) e: 끝번호
         * ************************************************************************************************/
        public int getRandom( int s, int e)
		{
			System.Threading.Thread.Sleep( 1 );
			return N.Next( s, e );
		}


        /***************************************************************************************************
         * 1. 함수: 랜덤하게 자식노드 값 입력
         * 2. 설명: 그리드 범위가 0.0001초 기다린 후 C 다음 값 리턴
         * 3. 입력 
         *    1) s: 시작번호
         *    2) e: 끝번호
         * ************************************************************************************************/
		public int getRandomChild( int s, int e )
		{
			System.Threading.Thread.Sleep( 1 );
			return C.Next( s, e );
		}

        /***************************************************************************************************
         * 1. 함수: 훼손된 노드 생성
         * 2. 설명: CH헤드 중 변조된 훼손노드 생성
         * 3. 입력 
         *    1) SN: 센서노드 개수
         *    2) ndid: 센서노드 해당 아이디
         * ************************************************************************************************/
		public int makeCompromisedNodes( C_NODE[] SN, int ndid )
		{
			int i = 0;
			bool flag = false;

			int temp = getRandomChild( 0, ST.OCHLD - 1 );

			for ( i = 0; i < ST.OTVFV; i++ )
			{
				if ( SN[ndid].CPND[i] == temp )
				{
					flag = true;
					break;
				}
			}

			if ( flag == true)
			{
				if ( ST.OTVFV >= i +1 )
					return -1;

				SN[ndid].CPND[i+1] = temp;
			}
			else
				SN[ndid].CPND[0] = temp;

			return 0;
		}
	}
}
